import {
  setToken,
  getToken,
  removeToken,
  setTimeStamp
} from '@/utils/auth'
import {
  login,
  getUserInfo,
  getUserDetailById
} from '@/api/user'
// 导入路由文件中重置路由的函数
import {
  resetRouter
} from '@/router'
export default {
  namespaced: true,
  state: {
    token: getToken(), // 从缓存中读取token
    userInfo: {} // 保存登录用户的基本信息,定义一个空的对象 不是null 因为后边我要开发userInfo的属性给别人用  userInfo.name
  },
  mutations: {
    // 设置token
    setToken(state, token) {
      state.token = token
      // 持久化存储token
      setToken(token)
    },
    // 删除token
    removeToken(state) {
      state.token = null
      // 删除cookie中的持久化存储的token
      removeToken()
    },
    // 设置用户信息
    setUserInfo(state, userInfo) {
      state.userInfo = userInfo
    }

  },
  actions: {
    // 登录
    async login(context, payload) {
      const token = await login(payload)
      context.commit('setToken', token)
      // 将当前时间戳写入的cookie中
      setTimeStamp()
    },
    // 获取用户信息
    async getUserInfo(context) {
      const result = await getUserInfo() // 用户的基本资料
      const baseInfo = await getUserDetailById(result.userId) // 用户详情资料
      // 合并2个数据
      const baseResult = {
        ...result,
        ...baseInfo
      }
      // 去触发mutations的方法更改vuex中userInfo的数据
      context.commit('setUserInfo', baseResult)
      // 加一个点睛之笔  这里这一步，暂时用不到，但是请注意，这给我们后边会留下伏笔
      // 筛选权限时使用这个结果
      return baseResult
    },
    // 退出登录
    logout(context) {
      // 清除token
      context.commit('removeToken')
      // 清除用户信息
      context.commit('setUserInfo', {})
      // 重置理由
      resetRouter()
      // 清空perimisson模块中保留的routes这个数据
      // 父模块 调用 子模块的action
      // 默认当前模块的context是当前模块的， 只需要将 commit提升为父模块的context即可，将第三个参数 设置成  { root: true } 就表示当前的context不是子模块了而是父模块
      context.commit('permission/setRoutes', [], {
        root: true
      })
    }
  }
}
